package Classes;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

/**
 * 
 * @author JAVA - LI
 *
 */
public class RecomendacaoPersonalizada {
	ArrayList<Estabelecimento> restaurantes;
	Map<Integer,ArrayList<Usuario>> map;
	ArrayList<Usuario> arrayUser;
	ArrayList<ArrayList<Usuario>> arrays;
	ArrayList<Integer> arrayInt;
	
	/**
	 * Cria um objeto da classe RecomendacaoPersonalizada.
	 */
	public RecomendacaoPersonalizada(){
		restaurantes = new ArrayList<Estabelecimento>();
		map = new HashMap<Integer,ArrayList<Usuario>>();
		arrays = new ArrayList<ArrayList<Usuario>>();
		arrayInt = new ArrayList<Integer>();
	}
	
	/**
	 * Retorna uma lista de restaurantes recomendados para determinado usuario.
	 * @param usuarios Lista de usuarios a ser verificada para sugestao.
	 * @param usuario Usuario que recebera recomendacao especifica.
	 * @param numero Quantidade de recomendacoes a serem feitas.
	 * @return Uma lista de restaurantes recomendados para determinado usuario.
	 */
	public ArrayList<Estabelecimento> sugeriPersonalizado(RepositorioDeUsuarios usuarios ,Usuario usuario,int numero){
                
		//removePorObj(usuario);
		int soma;
		Usuario user;
		
		Iterator<Usuario> it = usuarios.getUsuarios().iterator();
		while(it.hasNext()){
			soma = 0;
			user = it.next();
			Iterator<Opniao> itOpi = usuario.getPreferencias().iterator();
			for(Opniao opi : user.getPreferencias()){
				if(!(user.equals(usuario))){
					if(usuario.getOpniaoBoolean(opi.getNomeEstabelecimento())){
						soma+=(opi.getNota()*itOpi.next().getNota());
					}
				}
			}
			arrayUser = new ArrayList<Usuario>();
			if(!(map.keySet().contains(soma))){
				arrayUser.add(user);
				map.put(soma,arrayUser);
			}else{
				arrayUser = map.get(soma);
				arrayUser.add(user);
				map.put(soma, arrayUser);
			}
			
		}
		
		for(Integer valor : map.keySet()){
			arrayInt.add(valor);
		}
		
		Collections.sort(arrayInt);
		Collections.reverse(arrayInt);
		
                for(Integer inteiro : arrayInt){
                    ArrayList<Usuario> arrayMap =  map.get(inteiro);
			for(Usuario parecido : arrayMap){
				for(Opniao op : parecido.getPreferencias()){
                                        if((parecido.getPreferencias().size()==usuario.getPreferencias().size())){
                                            if((restaurantes.size()<numero)&&((op.getNota()>0))&&(!(restaurantes.contains(op.getEstabelecimento())))&&((usuario.getOpniao(op.getNomeEstabelecimento())).getNota()==0)){
                                                    restaurantes.add(op.getEstabelecimento());
                                                
                                            }
                                        }else{
                                            if((op.getNota()>0)&&(usuario.getOpniaoBoolean(op.getNomeEstabelecimento())==false)&&!(restaurantes.contains(op.getEstabelecimento()))&&(restaurantes.size()<numero)){
						restaurantes.add(op.getEstabelecimento());
                                                
                                            }
                                        }
				}
			}
                    
                }
		
		return restaurantes;
	}

}
